Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / networkVisualiserCache.js

Displaying Raw • Download


meshchatx/src/frontend/js/networkVisualiserCache.js 9f75e3db181925ddd253f7fb231af81f9fb8c013 (9f75e3db) Text, 5.29 KB

T8b949e// SPDX-License-Identifier: 0BSD AND MIT

T8b949e/**
* Identity-scoped IndexedDB cache for the network visualiser.
* Stores path rows, announces, and node positions so reopen can paint quickly
* and only fetch announces for newly seen destination hashes.
*/

Tff7b72const Te6edf3DB_NAME Tff7b72= Ta5d6ff"meshchatx_visualiser_cache"Tb4b4b4;
Tff7b72const Te6edf3DB_VERSION Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72const Te6edf3STORE_NAME Tff7b72= Ta5d6ff"snapshots"Tb4b4b4;
Tff7b72const Te6edf3CACHE_VERSION Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72const Te6edf3MAX_AGE_MS Tff7b72= T79c0ff7 Tff7b72* T79c0ff24 Tff7b72* T79c0ff60 Tff7b72* T79c0ff60 Tff7b72* T79c0ff1000Tb4b4b4;

Tff7b72let Te6edf3dbPromise Tff7b72= Tff7b72nullTb4b4b4;

Tff7b72function Te6edf3getIdbTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(
Tffa657globalThisTb4b4b4.Te6edf3indexedDB Tff7b72|| Tffa657globalThisTb4b4b4.Te6edf3mozIndexedDB Tff7b72|| Tffa657globalThisTb4b4b4.Te6edf3webkitIndexedDB Tff7b72|| Tffa657globalThisTb4b4b4.Te6edf3msIndexedDB Tff7b72|| Tff7b72null
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3openDbTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3dbPromiseTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3dbPromiseTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3idb Tff7b72= Te6edf3getIdbTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3idbTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3rejectTb4b4b4(Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"IndexedDB unavailable"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3dbPromise Tff7b72= Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3req Tff7b72= Te6edf3idbTb4b4b4.Te6edf3openTb4b4b4(Te6edf3DB_NAMETb4b4b4, Te6edf3DB_VERSIONTb4b4b4)Tb4b4b4;
Te6edf3reqTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3rejectTb4b4b4(Te6edf3reqTb4b4b4.Te6edf3error Tff7b72|| Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"IndexedDB open failed"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3reqTb4b4b4.Te6edf3onupgradeneeded Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3db Tff7b72= Te6edf3reqTb4b4b4.Te6edf3resultTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3dbTb4b4b4.Te6edf3objectStoreNamesTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3STORE_NAMETb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3dbTb4b4b4.Te6edf3createObjectStoreTb4b4b4(Te6edf3STORE_NAMETb4b4b4, Tb4b4b4{ Te6edf3keyPathTff7b72: Ta5d6ff"identityHash" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Te6edf3reqTb4b4b4.Te6edf3onsuccess Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3resolveTb4b4b4(Te6edf3reqTb4b4b4.Te6edf3resultTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dbPromiseTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3clonePlainTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {string} identityHash
* @returns {Promise<{ identityHash: string, savedAt: number, pathTable: object[], announces: object, positions: object }|null>}
*/
Tff7b72export Tff7b72async Tff7b72function Te6edf3loadVisualiserCacheTb4b4b4(Te6edf3identityHashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3identityHash Tff7b72|| Tff7b72typeof Te6edf3identityHash Tff7b72!== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3db Tff7b72= Tff7b72await Te6edf3openDbTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3row Tff7b72= Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3tx Tff7b72= Te6edf3dbTb4b4b4.Te6edf3transactionTb4b4b4(Te6edf3STORE_NAMETb4b4b4, Ta5d6ff"readonly"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3req Tff7b72= Te6edf3txTb4b4b4.Te6edf3objectStoreTb4b4b4(Te6edf3STORE_NAMETb4b4b4)Tb4b4b4.Te6edf3getTb4b4b4(Te6edf3identityHashTb4b4b4)Tb4b4b4;
Te6edf3reqTb4b4b4.Te6edf3onsuccess Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3resolveTb4b4b4(Te6edf3reqTb4b4b4.Te6edf3result Tff7b72|| Tff7b72nullTb4b4b4)Tb4b4b4;
Te6edf3reqTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3rejectTb4b4b4(Te6edf3reqTb4b4b4.Te6edf3errorTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3row Tff7b72|| Te6edf3rowTb4b4b4.Te6edf3version Tff7b72!== Te6edf3CACHE_VERSIONTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rowTb4b4b4.Te6edf3savedAt Tff7b72!== Ta5d6ff"number" Tff7b72|| Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3rowTb4b4b4.Te6edf3savedAt Tff7b72> Te6edf3MAX_AGE_MSTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3rowTb4b4b4.Te6edf3pathTableTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3identityHashTff7b72: Te6edf3rowTb4b4b4.Te6edf3identityHashTb4b4b4,
Te6edf3savedAtTff7b72: Te6edf3rowTb4b4b4.Te6edf3savedAtTb4b4b4,
Te6edf3pathTableTff7b72: Te6edf3rowTb4b4b4.Te6edf3pathTableTb4b4b4,
Te6edf3announcesTff7b72: Te6edf3rowTb4b4b4.Te6edf3announces Tff7b72&& Tff7b72typeof Te6edf3rowTb4b4b4.Te6edf3announces Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3rowTb4b4b4.Te6edf3announces Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3positionsTff7b72: Te6edf3rowTb4b4b4.Te6edf3positions Tff7b72&& Tff7b72typeof Te6edf3rowTb4b4b4.Te6edf3positions Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3rowTb4b4b4.Te6edf3positions Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @param {{ identityHash: string, pathTable: object[], announces: object, positions: object, pathSoftCap?: number, announceSoftCap?: number }} snapshot
*/
Tff7b72export Tff7b72async Tff7b72function Te6edf3saveVisualiserCacheTb4b4b4(Te6edf3snapshotTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3identityHash Tff7b72= Te6edf3snapshotTff7b72?Tb4b4b4.Te6edf3identityHashTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3identityHash Tff7b72|| Tff7b72typeof Te6edf3identityHash Tff7b72!== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3pathSoftCap Tff7b72= Te6edf3snapshotTb4b4b4.Te6edf3pathSoftCap Tff7b72?? T79c0ff20Te6edf3_000Tb4b4b4;
Tff7b72const Te6edf3announceSoftCap Tff7b72= Te6edf3snapshotTb4b4b4.Te6edf3announceSoftCap Tff7b72?? T79c0ff10Te6edf3_000Tb4b4b4;
Tff7b72let Te6edf3pathTable Tff7b72= Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3snapshotTb4b4b4.Te6edf3pathTableTb4b4b4) Tff7b72? Te6edf3snapshotTb4b4b4.Te6edf3pathTable Tff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pathTableTb4b4b4.Te6edf3length Tff7b72> Te6edf3pathSoftCapTb4b4b4) Tb4b4b4{
Te6edf3pathTable Tff7b72= Te6edf3pathTableTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3pathSoftCapTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3announcesIn Tff7b72= Te6edf3snapshotTb4b4b4.Te6edf3announces Tff7b72&& Tff7b72typeof Te6edf3snapshotTb4b4b4.Te6edf3announces Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3snapshotTb4b4b4.Te6edf3announces Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3announceKeys Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3keysTb4b4b4(Te6edf3announcesInTb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3announces Tff7b72= Te6edf3announcesInTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3announceKeysTb4b4b4.Te6edf3length Tff7b72> Te6edf3announceSoftCapTb4b4b4) Tb4b4b4{
Te6edf3announces Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3key Tff7b72of Te6edf3announceKeysTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3announceSoftCapTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3announcesTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3announcesInTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72const Te6edf3positions Tff7b72= Te6edf3snapshotTb4b4b4.Te6edf3positions Tff7b72&& Tff7b72typeof Te6edf3snapshotTb4b4b4.Te6edf3positions Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3snapshotTb4b4b4.Te6edf3positions Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4;

Tff7b72const Te6edf3row Tff7b72= Tb4b4b4{
Te6edf3identityHashTb4b4b4,
Te6edf3versionTff7b72: Te6edf3CACHE_VERSIONTb4b4b4,
Te6edf3savedAtTff7b72: Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3pathTableTff7b72: Te6edf3clonePlainTb4b4b4(Te6edf3pathTableTb4b4b4)Tb4b4b4,
Te6edf3announcesTff7b72: Te6edf3clonePlainTb4b4b4(Te6edf3announcesTb4b4b4)Tb4b4b4,
Te6edf3positionsTff7b72: Te6edf3clonePlainTb4b4b4(Te6edf3positionsTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72const Te6edf3db Tff7b72= Tff7b72await Te6edf3openDbTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3tx Tff7b72= Te6edf3dbTb4b4b4.Te6edf3transactionTb4b4b4(Te6edf3STORE_NAMETb4b4b4, Ta5d6ff"readwrite"Tb4b4b4)Tb4b4b4;
Te6edf3txTb4b4b4.Te6edf3oncomplete Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3resolveTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3txTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3rejectTb4b4b4(Te6edf3txTb4b4b4.Te6edf3errorTb4b4b4)Tb4b4b4;
Te6edf3txTb4b4b4.Te6edf3objectStoreTb4b4b4(Te6edf3STORE_NAMETb4b4b4)Tb4b4b4.Te6edf3putTb4b4b4(Te6edf3rowTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @param {string} identityHash
*/
Tff7b72export Tff7b72async Tff7b72function Te6edf3clearVisualiserCacheTb4b4b4(Te6edf3identityHashTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3identityHashTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3db Tff7b72= Tff7b72await Te6edf3openDbTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3tx Tff7b72= Te6edf3dbTb4b4b4.Te6edf3transactionTb4b4b4(Te6edf3STORE_NAMETb4b4b4, Ta5d6ff"readwrite"Tb4b4b4)Tb4b4b4;
Te6edf3txTb4b4b4.Te6edf3oncomplete Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3resolveTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3txTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3rejectTb4b4b4(Te6edf3txTb4b4b4.Te6edf3errorTb4b4b4)Tb4b4b4;
Te6edf3txTb4b4b4.Te6edf3objectStoreTb4b4b4(Te6edf3STORE_NAMETb4b4b4)Tb4b4b4.Tff7b72deleteTb4b4b4(Te6edf3identityHashTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/** Test helper to reset the open handle between tests. */
Tff7b72export Tff7b72function Te6edf3resetVisualiserCacheDbHandleTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3dbPromise Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────